package com.ekgc.addressbook.base.pojo.vo;

import com.ekgc.addressbook.base.pojo.enums.RespCode;
import lombok.Data;
import org.springframework.validation.FieldError;

import java.io.Serializable;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * <b>基础功能 -- 系统响应视图</b>
 *
 * @author FanSheng
 * @version 1.0
 */
@Data
public class ResponseVO<T> implements Serializable {
	private static final long serialVersionUID = 8404183839835221100L;
	private String code;                // 系统响应编码
	private String message;             // 系统响应信息
	private T data;                     // 系统响应数据

	private ResponseVO(String code, String message, T data) {
		this.code = code;
		this.message = message;
		this.data = data;
	}

	/**
	 * <b>创建响应视图</b>
	 * @param code
	 * @param message
	 * @param data
	 * @return
	 */
	public static ResponseVO createResponseVO(RespCode code, String message, Object data) {
		// 判断是否给定了有效响应编码
		if (!Optional.ofNullable(code).isPresent()) {
			return new ResponseVO(RespCode.RESP_EXCEPTION.getCode(), "为给定有效的相应编码", new String(""));
		}

		// 判断是否给定了有效响应信息
		if (!Optional.ofNullable(message).isPresent()) {
			// 未给定，采用默认信息
			message=code.getMsg();
		}

		// 判断是否给定了有效响应数据
		if (!Optional.ofNullable(data).isPresent()) {
			data=new String("");
		}
		return new ResponseVO(code.getCode(), message, data);
	}

	/**
	 * <b>创建系统业务处理成功视图信息</b>
	 * @param message
	 * @return
	 * @throws Exception
	 */
	public static ResponseVO createSuccessResponseVO(String message) {
		return ResponseVO.createResponseVO(RespCode.RESP_SUCCESS, message, new String(""));
	}

	/**
	 * <b>创建系统业务处理成功视图信息</b>
	 * @param message
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public static ResponseVO createSuccessResponseVO(String message,Object data) throws Exception {
		return ResponseVO.createResponseVO(RespCode.RESP_SUCCESS, message, data);
	}

	/**
	 * <b>创建系统业务处理错误响应视图信息</b>
	 * @param message
	 * @return
	 * @throws Exception
	 */
	public static ResponseVO createFailureResponseVO(String message) {
		return ResponseVO.createResponseVO(RespCode.RESP_FAILURE, message, new String(""));
	}

	/**
	 * <b>创建系统业务处理错误响应视图信息</b>
	 * @param message
	 * @param errorList
	 * @return
	 */
	public static ResponseVO createFailureResponseVO(String message, List<FieldError> errorList) {
		// 判断能否获得有效的错误信息列表
		if (Optional.ofNullable(errorList).isPresent() && !errorList.isEmpty()) {
			// 提取错误信息，封装集合
			List<String> errorMessageList = errorList.stream()
					.map(error -> error.getDefaultMessage())
					.collect(Collectors.toList());
			return ResponseVO.createResponseVO(RespCode.RESP_FAILURE, message, errorMessageList);
		}
		return ResponseVO.createResponseVO(RespCode.RESP_FAILURE, message, new String(""));
	}

	/**
	 * <b>创建用户未认证响应视图信息</b>
	 * @return
	 */
	public static ResponseVO createUnauthorizedResponseVO() {
		return ResponseVO.createResponseVO(RespCode.RESP_UNAUTH, RespCode.RESP_UNAUTH.getMsg(), new String(""));
	}

	/**
	 * <b>创建系统响应异常响应视图信息</b>
	 * @param e
	 * @return
	 * @throws Exception
	 */
	public static ResponseVO createExceptionResponseVO(Exception e) {
		return ResponseVO.createResponseVO(RespCode.RESP_EXCEPTION, e.getMessage(), e);
	}

	/**
	 * <b>创建失败响应</b>
	 * @param message 错误信息
	 * @return ResponseVO实例
	 */
	public static <T> ResponseVO<T> fail(String message) {
		return new ResponseVO<>(RespCode.RESP_FAILURE.getCode(), message, null);
	}

	/**
	 * <b>创建失败响应（带错误码）</b>
	 * @param code 错误码
	 * @param message 错误信息
	 * @return ResponseVO实例
	 */
	public static <T> ResponseVO<T> fail(String code, String message) {
		return new ResponseVO<>(code, message, null);
	}

	/**
	 * <b>创建失败响应（带数据）</b>
	 * @param message 错误信息
	 * @param data 错误数据
	 * @return ResponseVO实例
	 */
	public static <T> ResponseVO<T> fail(String message, T data) {
		return new ResponseVO<>(RespCode.RESP_FAILURE.getCode(), message, data);
	}

}
